package cn.tedu.tmall.front.mall.dao.search.impl;

import cn.tedu.tmall.common.pojo.po.GoodsSearchPO;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.annotations.Highlight;
import org.springframework.data.elasticsearch.annotations.HighlightField;
import org.springframework.data.elasticsearch.annotations.HighlightParameters;
import org.springframework.data.elasticsearch.annotations.Query;
import org.springframework.data.elasticsearch.core.SearchPage;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface GoodsElasticsearchRepository
        extends ElasticsearchRepository<GoodsSearchPO, Long> {

    // https://docs.spring.io/spring-data/elasticsearch/docs/4.2.1/reference/html/

    // 【用法1：简单搜索】
    // 1. 你只需要定义抽象方法即可
    // 2. 你必须按照规范设计抽象方法的名称
    // 3. 方法的返回值类型是相对固定的
    List<GoodsSearchPO> queryByTitle(String keyword);

    // 【用法2：分页】
    // 1. 可以使用SearchPage作为方法的返回值类型
    // 2. 必须在方法的参数列表的最后添加Pageable类型的参数
    SearchPage<GoodsSearchPO> queryByTitle(String keyword, Pageable pageable);

    // 【用法3：自定义query】
    // 1. 方法名完全自定义
    // 2. 参数列表自定义（Pageable仍必须是最后一个参数）
    // 3. 添加@Query注解，并在注解中配置搜索的query属性值
    // 4. 在query值中，使用 ?0 表示抽象方法的第1个参数值，使用 ?1 表示第2个参数值，以此类推
    // 5. 你可以按需添加其它配置，例如使用@Highlight注解配置高亮
    @Query("{\n" +
            "    \"bool\": {\n" +
            "      \"should\": [\n" +
            "        {\n" +
            "          \"match\": {\n" +
            "            \"title\": \"?0\"\n" +
            "          }\n" +
            "        },\n" +
            "        {\n" +
            "          \"match\": {\n" +
            "            \"brief\": \"?0\"\n" +
            "          }\n" +
            "        },\n" +
            "        {\n" +
            "          \"match\": {\n" +
            "            \"keywords\": \"?0\"\n" +
            "          }\n" +
            "        }\n" +
            "      ]}}")
    @Highlight(fields = {@HighlightField(name = "title")},
        parameters = @HighlightParameters(preTags = "<b>", postTags = "</b>"))
    SearchPage<GoodsSearchPO> customSearch(String keyword, Pageable pageable);

}
